/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.padrao.presenter;

import br.com.webhomesites.padrao.contracts.IGrupoProdutoPresenter;
import br.com.webhomesites.padrao.model.BuscarGrupoProdutoModel;
import br.com.webhomesites.padrao.model.GrupoProdutoDAO;
import br.com.webhomesites.padrao.model.GrupoProdutoModel;
import br.com.webhomesites.padrao.presenter.ProdutoPresenterActionListeners.SairActionListener;
import br.com.webhomesites.padrao.utils.Strategy;
import br.com.webhomesites.padrao.view.BuscarGrupoProdutoView;
import br.com.webhomesites.padrao.view.GrupoProdutoView;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Webhome
 */
public class GrupoProdutoPresenter implements IGrupoProdutoPresenter {

    private GrupoProdutoModel grupoProdutoModel;
    private GrupoProdutoDAO grupoProdutoDAO;
    private GrupoProdutoView grupoProdutoView;
    public final Strategy INSERT_STRATEGY = new InsertStrategy();
    public final Strategy UPDATE_STRATEGY = new UpdateStrategy();
    public final Strategy REMOVE_STRATEGY = new RemoveStrategy();
    private Strategy operacao = INSERT_STRATEGY;

    public GrupoProdutoPresenter(GrupoProdutoModel grupoProdutoModel, GrupoProdutoView grupoProdutoView, GrupoProdutoDAO grupoProdutoDAO) {
        this.grupoProdutoModel = grupoProdutoModel;
        this.grupoProdutoView = grupoProdutoView;
        this.grupoProdutoDAO = grupoProdutoDAO;
    }

    @Override
    public void setUpViewListeners() {
        grupoProdutoView.setInserirActionListener(new GrupoProdutoPresenterActionListeners.InserirActionListener(this));
        grupoProdutoView.setRemoverActionListener(new GrupoProdutoPresenterActionListeners.RemoverActionListener(this));
        grupoProdutoView.setAlterarActionListener(new GrupoProdutoPresenterActionListeners.AlterarActionListener(this));
        grupoProdutoView.setCancelarActionListener(new GrupoProdutoPresenterActionListeners.CancelarActionListener(this));
        grupoProdutoView.setSalvarActionListener(new GrupoProdutoPresenterActionListeners.SalvarActionListener(this));
        grupoProdutoView.setBtnSairActionListener(new SairActionListener());

        grupoProdutoView.setBuscaAvancadaActionlistener(new GrupoProdutoPresenterActionListeners.BuscaAvancadaActionlistener(this));
    }

    @Override
    public void updateModelFromView() {


        grupoProdutoModel.setId(grupoProdutoView.getCodigo());
        grupoProdutoModel.setDescricao(grupoProdutoView.getDescricao());
        if(operacao==INSERT_STRATEGY) {
        grupoProdutoDAO.save(grupoProdutoModel);
        
        } else if(operacao==UPDATE_STRATEGY) {
            grupoProdutoDAO.update(grupoProdutoModel);
        } else if(operacao==REMOVE_STRATEGY) {
            grupoProdutoDAO.delete(grupoProdutoModel);
        }

    }

    @Override
    public void updateViewFromModel() {
        if (grupoProdutoModel != null) {
            grupoProdutoView.setCodigo(grupoProdutoModel.getId());
            grupoProdutoView.setDescricao(grupoProdutoModel.getDescricao());

        } else {
            grupoProdutoView.clearFields();
        }
    }

    @Override
    public void novoGrupo() {
        grupoProdutoView.setCodigo(grupoProdutoDAO.getMaxId() + 1);

        grupoProdutoModel = new GrupoProdutoModel();
        List<GrupoProdutoModel> produtos = grupoProdutoDAO.findByDescricao("furadeira");
        for (GrupoProdutoModel produto : produtos) {
            System.out.println("Produto: " + produto.getDescricao());
        }
     
        Long id = grupoProdutoDAO.getMaxId();
        System.out.println("Id: " + id);

//        id = grupoProdutoDAO.getIdByDescricao("fur");
//        System.out.println("Id da descrição: " + id);
//
//        id = grupoProdutoDAO.getIdByDescricao("fur");
        System.out.println("Id da descrição: " + id);

//        GrupoProdutoModel modelo = grupoProdutoDAO.findByDescricaoUnica("furadeira");
//        System.out.println("Descrição unica: " + modelo.getDescricao());

    }

    @Override
    public void inserirGrupo() {
        this.updateModelFromView();
        //grupoProdutoView.clearFields();
    }

    @Override
    public void alterarGrupo() {
        this.updateModelFromView();
    }

    @Override
    public void removerGrupo() {
        this.updateModelFromView();
    }

    @Override
    public void habilitarEdicao(boolean arg) {
        grupoProdutoView.enableTxtGrupoCodigo(arg);
        grupoProdutoView.enableTxtGrupoDescricao(arg);
       
        grupoProdutoView.enableBtnCancelar(arg);
        grupoProdutoView.enableBtnRemover(arg);
        grupoProdutoView.enableBtnSalvar(arg);
    }

    @Override
    public GrupoProdutoView getView() {
        return grupoProdutoView;
    }

    @Override
    public GrupoProdutoModel getModel() {
        return grupoProdutoModel;
    }

    @Override
    public void setView(GrupoProdutoView grupoProdutoView) {
        this.grupoProdutoView = grupoProdutoView;
    }

    @Override
    public void setModel(GrupoProdutoModel model) {
        this.grupoProdutoModel = model;
    }

    @Override
    public void createView() {
        //this.novoProduto();            
        this.setUpViewListeners();
        //this.habilitarEdicao(false);
        List<String> listaTipos = new ArrayList<>();
        listaTipos.add("Furadeirra");
        listaTipos.add("Britadeira");
        
        grupoProdutoView.packAndShow();
    }
    
    public void buscaAvancada() {

        BuscarGrupoProdutoModel buscarGrupoProdutoModel = new BuscarGrupoProdutoModel();

        BuscarGrupoProdutoView buscarGrupoProdutoView = new BuscarGrupoProdutoView(javax.swing.JOptionPane.getFrameForComponent(grupoProdutoView), true);

        BuscarGrupoProdutoPresenter buscarGrupoProdutoPresenter = new BuscarGrupoProdutoPresenter(this, buscarGrupoProdutoView, buscarGrupoProdutoModel);
        buscarGrupoProdutoPresenter.setBuscador(buscarGrupoProdutoPresenter.BUSCADOR_GRUPO_PRODUTO_VIEW);
        buscarGrupoProdutoPresenter.createView();

    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    private class InsertStrategy implements Strategy {

        @Override
        public void execute() {
            inserirGrupo();
        }
    }

    private class UpdateStrategy implements Strategy {

        @Override
        public void execute() {
            alterarGrupo();
        }
    }
    
    private class RemoveStrategy implements Strategy {

        @Override
        public void execute() {
            removerGrupo();
        }
    }
}
